<?php

/*
Aurus CMS - free OOP CMS
Copyright (C) 2010  Nestor Yanchuk

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
if (!defined('ROOT'))
die();

/**
 * Клас для взаємодії ядра і модулів
 *
 * @package Aurus
 * @author Kvis
 * @copyright 2010
 * @version 1.0
 * @access public
 */
class Modules implements Core {

	/**
     * Return an instance of class
     *
     * @return Modules
     */
	public static function getInstance() {
		return Factory::get(__CLASS__);
	}

	/**
     * Масив всіх додатків: модулів, плаґінів та редакторів
     *
     * @var array
     */
	private $addons = array();
	private $relations = array();

	/**
     * Конструктор класу
     *
     */
	function __construct() {
		$addons = Cache::callFunction(array(Mysql::getInstance(), 'select'), array('modules'));

		$this->addons['modules'] = array();
		$this->addons['plugins'] = array();
		$this->addons['editors'] = array();
		foreach ($addons as $addon) {
			switch ($addon['type']) {
				case 'module':
					$this->addons['modules'][] = $addon['name'];
					break;
				case 'editor':
					$this->addons['editors'][] = $addon['name'];
					break;
				case 'plugin':
					$this->addons['plugins'][] = $addon['name'];
					break;
			}
		}
		asort($this->addons['modules']);
		asort($this->addons['editors']);
		asort($this->addons['plugins']);
	}

	public function setModelAndModuleRelation($model, $module) {
		$this->relations[$model] = $module;
	}

	/**
     * Функція повертає назву модуля, який має завантажитись на даній сторінці
     *
     * @return string - назва модуля
     */
	function getModuleToLoad() {
		if (AJAX && !empty($_REQUEST['module'])) {
			return in_array($_REQUEST['module'], $this->addons['modules']) ? $_REQUEST['module'] : false;
		}

		if ($model = Url::getModel()) {
			if (isset($this->relations[$model])){
			return $this->relations[$model];
			}
			return $model;
		} else {
			$im = Config::get('index_module');
			if ($_SERVER['QUERY_STRING'] == '') {
				return in_array($im, $this->addons['modules']) ? $im : false;
			}
		}

		return false;
	}

	/**
     * Генерація нового коду для капчі
     *
     * @return string - новий код
     */
	function generateNewCaptchaCode() {
		$allowed_symbols = '23456789abcdeghkmnpqsuvxyz';
		$st = strlen($allowed_symbols) - 1;
		$length = mt_rand(5, 6);

		$keystring = '';
		for ($i = 0; $i < $length; $i++) {
			$keystring .= $allowed_symbols[mt_rand(0, $st)];
		}

		return $keystring;
	}

	/**
     * Функція генерує новий код капчі для модуля $mod і повертає згенерований HTML код картинки капчі
     *
     * @param string $mod
     * @return
     */
	function getCaptcha($mod) {
		$_SESSION['captcha_' . $mod] = $this->generateNewCaptchaCode();
		return '<img src="' . Url::formatUrl('captcha', array('rand' => rand()), true, $mod) . '" alt="' . __('Натисніть, щоб перезавантажити') . '" id="id_' . $mod . '" onclick="reload_captcha(this.id,\'' . $mod . '\');" />';
	}

	/**
     * Функція перевіряє чи правильно користувач ввів код безпеки
     *
     * @param string $code - введений код
     * @param string $mod - назва модуля
     * @return
     */
	function checkCaptcha($code, $mod) {
		if ($code == '' or $mod == '' or !$code or !$mod) {
			return false;
		}
		if (isset($_SESSION['captcha_' . $mod]) and $_SESSION['captcha_' . $mod] == $code) {
			return true;
		}
		return false;
	}

	/**
     * Функція додає RegEx тег $tag в шаблон $template
     *
     * @param string $template - назва шаблону
     * @param string $tag - шаблон тегу в форматі RegEx
     * @param string $repalacement - на що замінити тег, наприклад 
     * @return
     */
	function addRegExpTagInTemplate($template, $tag, $repalacement) {
		Template::getInstance()->regExpTagsInTemplates[$template][$tag] = $repalacement;
	}

	/**
     * Отримання навігації по сторінках
     *
     * @param string $current - поточна сторінка
     * @param string $countPerPage - кількість матеріалів на сторінку
     * @param string $All - кількість всіх матеріалів
     * @param string $hrefStart - початок посилання, текст який буде додано перед цифрою з номером сторінки
     * @param string $hrefEnd - кінець посилання, текст який буде додано після цифри з номером сторінки
     * @param string $dilim - розділювач сторінок
     * @return
     */
	function genNavAsText($current, $countPerPage, $All, $hrefStart = '', $hrefEnd = '', $dilim = ' | ') {
		$pages_count = ceil($All / $countPerPage);
		if ($pages_count <= 1) {
			return '';
		}
		if ($current - 1 > 0)
		$page1left = '<a href="' . $hrefStart . ($current - 1) . $hrefEnd . '">' . ($current - 1) . '</a> ';
		if ($current - 2 > 0)
		$page2left = '<a href="' . $hrefStart . ($current - 2) . $hrefEnd . '">' . ($current - 2) . '</a> ';
		if ($current - 3 > 0)
		$page3left = '<a href="' . $hrefStart . ($current - 3) . $hrefEnd . '">' . ($current - 3) . '</a> ';
		if ($current - 4 > 0)
		$page4left = '<a href="' . $hrefStart . ($current - 4) . $hrefEnd . '">' . ($current - 4) . '</a> ';
		if ($current + 1 <= $pages_count)
		$page1right = '<a href="' . $hrefStart . ($current + 1) . $hrefEnd . '">' . ($current + 1) . '</a> ';
		if ($current + 2 <= $pages_count)
		$page2right = '<a href="' . $hrefStart . ($current + 2) . $hrefEnd . '">' . ($current + 2) . '</a> ';
		if ($current + 3 <= $pages_count)
		$page3right = '<a href="' . $hrefStart . ($current + 3) . $hrefEnd . '">' . ($current + 3) . '</a> ';
		if ($current + 4 <= $pages_count)
		$page4right = '<a href="' . $hrefStart . ($current + 4) . $hrefEnd . '">' . ($current + 4) . '</a> ';
		$pages_e = $page4left . $page3left . $page2left . $page1left . ' <span>' . $current . '</span> ' . $page1right . $page2right . $page3right . $page4right;

		return $pages_e;
	}

	/**
     * Повертає масив всіх додатків сайту
     *
     * @return
     */
	function getActiveAddons() {
		return $this->addons;
	}

	/**
     * Список всіх активних модулів
     *
     * @return
     */
	function getActiveModules() {
		$ret = array();
		foreach ($this->addons['modules'] as $mod) {
			$nfo = @simplexml_load_file(MAINDIR . '/modules/' . $mod . '/info.xml');
			if ($nfo) {
				$ret[$mod] = $nfo->name;
			} else {
				$ret[$mod] = $mod;
			}
		}
		return $ret;
	}

	function loadModule($module) {
		if (!$module) {
			error(__('Неможливо завантажити модуль'));
		}
		$mod = 'Module_' . $module;
		if (!class_exists($mod)) {
			error('Class ' . $mod . ' not found!');
		}
		if (!in_array('Module', class_implements($mod))) {
			error('Class \'' . $mod . '\' must implements interface \'Module\'');
		}
		if (AJAX) {
			Factory::get($mod)->runAjax();
		} else {
			Factory::get($mod)->run();
		}
	}

}